Technical Q&A
NW 61 - DHCP オプションへのアクセス(1999 年 4 月 19
日)
Q:
いま開発中のクロスプラットフォーム接続製品で、DHCP
設定の追加オプションをもとに自動設定を行う機能を実装させようと思っています。これらの追加オプションへは、Open
Transport の TCP/IP スタック設定に使われる DHCP
パケットからアクセスすることができるでしょうか?
A: Open Transport 2.0.1
よりも前のバージョンでは、TCP/IP スタックの設定に利用する
DCHP パケットへアクセスする方法はありませんでした。Open
Transport 2.0.1 では OTInetGetDHCPConfigInfo という新しい
API ルーチンが登場したことにより、TCP/IP
スタックの設定に利用する DHCPACK
パケットのすべてのオプションにアクセスすることができます。この
Q&A では、その新ルーチンについて解説しましょう
ハInetDHCPOption
struct InetDHCPOption
{
UInt8 fOptionTag;
UInt8 fOptionLen;
UInt8 fOptionValue;
};
typedef struct InetDHCPOption InetDHCPOption;
|
このストラクチャは DHCP
オプションに関する情報を返すのに利用されるもので、各フィールドには次のような意味があります。
fOptionTag
- これは RFC 2132 DHCP
Options and BOOTP Vendor Extensions で規定される DHCP
タグオクテット (タグ付きデータ) を表します。
fOptionLen
- これはオプションの全長を表しますが、タグオクテットのサイズ、および全長のバイト数は含まれません。
fOptionValue
- このフィールドには、オプションを構成する不定のバイト配列を格納します。
ハOTInetGetDHCPConfigInfo
extern pascal OSStatus OTInetGetDHCPConfigInfo(InetDHCPOption* buf,
UInt32 bufSize, SInt32 index, SInt32 opt);
|
buf
|
OT の DHCP
オプション格納するバッファへのポインタです。
|
bufSize
|
上のバッファのサイズです。
|
index
|
ここで指定したインタフェースの DHCP
設定から、オプションを抽出することができます。OTInetGetInterfaceInfo
を呼び出す際のインタフェース指定に利用するインデックスと同じものです。デフォルトのインタフェースからオプションを取得したい場合は、kDefaultInetInterface
を指定してください。
|
opt
|
DHCP
設定から抽出するオプションのタグオクテットを指定するか、kAllDHCPOptions
と記述して全オプションを受け取ります。全オプションを要求した場合、オプションはDHCP
設定の内部に格納しているのと同じ形で圧縮されます。
|
result
|
エラー結果です。一般的なエラーには、kENOENTErr
(TCP/IP が読み込まれていない、または index
で指定したインタフェースが見つからないか、読み込まれなかった)、kEINVALErr
(index には kDefaultInetInterface
が指定されているのに、デフォルトのインタフェースが設定されていないか、特定のインタフェースが
DHCP または BOOTP
から設定されていない)、kENORSRCErr (TCP/IP
スタックの読み込み時に保存用のメモリが不足していたため、DHCP
情報が利用できない)、kOTBufferOverflowErr
(下記参照)、またはkOTBadOptionErr (opt
で指定したオプションが DHCP 設定の中にない)
が含まれます。
|
このルーチンは、buf と bufSize
で記述したバッファ領域で、index で指定したインタフェースの
DHCP オプション (タグオクテットを opt で指定したもの)
の値を返します。index に kDefaultInetInterface
を指定すると、デフォルトインタフェースのオプションを取得することができます。opt
に kAllDHCPOptions を指定すると、そのインタフェースの DHCP
オプションをすべて得ることができます。
opt に指定する標準的な値は、RFC 1700 「Assigned
Numbers」で規定されています。これらオプションの戻り値の書式は、RFC
2132 「DHCP
Options and BOOTP Vendor
Extensions」で規定されています。
重要:
オプションの値は、DHCPACK
パケット内に現れたものが返されるため、オプション値のコンポーネントフィールドが予想どおりの形で圧縮されていない可能性があります。オプション値を翻訳処理する前に、RFC
をチェックしてください。
|
このルーチンでは、オプションの値は buf と bufSize
で指定したバッファに収まる必要があります。バッファが小さすぎてオプション値を保持できない場合は、kOTBufferOverflowErr
が返されます。全オプションを要求したときにこのエラーが返された場合は、バッファには
bufSize
で指定した最初の数バイト分のオプション値が含まれます。特定のオプションを要求したときにこのエラーが返された場合は、バッファには有効なデータが含まれていません。
次のサンプルコードでは、コンピュータの設定に利用した
DHCP
パケットから、サブネットマスクのオプションを抽出する方法を示しています。
enum {
kDHCPSubnetMaskOption = 1
};
ハ
UInt8 optionBuffer[6];
ハ
err = OTInetGetDHCPConfigInfo( (InetDHCPOption*) optionBuffer,
sizeof(optionBuffer),
kDefaultInetInterface,
kDHCPSubnetMaskOption);
if (err == noErr) {
OTAssert("Got back wrong option", optionBuffer[0] == kDHCPSubnetMaskOption);
OTAssert("Option size is wrong ", optionBuffer[1] == sizeof(InetHost));
printf("Subnet mask provided by DHCP is %d.%d.%d.%d¥n",
optionBuffer[2],
optionBuffer[3],
optionBuffer[4],
optionBuffer[5]
);
}
|
-- Quinn "The Eskimo!"
Worldwide Developer Technical Support
Technical Q&As | Contents
Previous Question | Next
Question
To contact us, please use the Contact
Us page.
|